package com.zw.a.basic.a13.demo05_tickets_runnable;

import com.itheima.demo04_synchronized.MyThread;

//自定义的MyRunnable接口的子类对象, 充当: 资源对象.
/*
    Thread类中的构造方法和成员方法:
        构造方法:
            public Thread(Runnable target, String name);

        成员方法:
            public String getName();          获取当前正在执行的线程对象的名字.
            public static void sleep(long time) 让线程休眠指定时间, 单位是毫秒.
            public static Thread currentThread() 返回当前正在执行的线程对象的引用.
 */
public class MyRunnable implements Runnable {
    //1. 定义变量, 记录票数.
    private int tickets = 100;      //细节1: 不用写static, 因为四个线程共享同一个 资源对象.

    //2. 在run()方法中实现模拟卖票
    @Override
    public void run() {
        //3.一直卖票,  没有票, 就不卖了.
        while (true) {
            //************** 一次完整的卖票动作从这里开始..
            synchronized (this) {      //细节2:因为四个线程共享同一个 资源对象, 资源对象就new了一次, 所以就一个this.
                // 没有票, 就不卖了.
                if (tickets <= 0) {         //线程1,线程2 线程3, 线程4
                    break;
                }

                try {
                    Thread.sleep(50);   //单位是毫秒,  该方法的特点是: 在哪里睡, 到点后就在哪里醒来.     线程1,线程2 线程3, 线程4
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //走到这里, 说明有票, 卖票即可
                //Thread.currentThread(): 获取当前正在执行的线程对象.
                System.out.println(Thread.currentThread().getName() + "  售卖出第 " + tickets-- + " 张票");    //细节3: 这里要加入线程名, 即: 那个窗口卖的票.
            }
            //************** 一次完整的卖票动作到这里结束.
        }
    }
}